#                                                                    -*-perl-*-

$description = "Test ignored failures in recipe command lines";

run_make_test(qq!
one:
\t-exit 1
\texit 0
two:
\texit 1
\texit 0
!,
              "one", "exit 1\n#MAKE#: [#MAKEFILE#:3: one] Error 1 (ignored)\nexit 0\n");

# TEST #1
# -------

run_make_test(undef, " -i two",
              "exit 1\n#MAKE#: [#MAKEFILE#:6: two] Error 1 (ignored)\nexit 0\n");

# TEST #2
# -------

# Test that error line offset works

run_make_test(qq!
all:
\t\@echo hi
\t\@echo there
\t\@exit 1
!,
              '', "hi\nthere\n#MAKE#: *** [#MAKEFILE#:5: all] Error 1", 512);

# Windows error look completely different :-/

sub errors_getinfo
{
    my ($cmd, $args, $err) = @_;
    if ($port_type eq 'W32') {
        return (2, "process_begin: CreateProcess(NULL, $cmd$args, ...) failed.\nmake (e=2): The system cannot find the file specified.");
    }

    if (!$err) { $err = $ERR_no_such_file; }
    return (127, "#MAKE#: $cmd: $err");
}

# TEST #3
# -------

# Try failing due to unknown command
my $unk = './foobarbazbozblat';
unlink($unk);

my ($ernum, $erstr) = errors_getinfo($unk, " xx yy");
run_make_test(qq!
one: ; -$unk xx yy
!, 'one',
              "$unk xx yy\n$erstr\n#MAKE#: [#MAKEFILE#:2: one] Error $ernum (ignored)\n");

# TEST #4
# -------

($ernum, $erstr) = errors_getinfo($unk, " aa bb");
run_make_test(qq!
two: ; $unk aa bb
!, 'two -i',
              "$unk aa bb\n$erstr\n#MAKE#: [#MAKEFILE#:2: two] Error $ernum (ignored)\n");

# TEST #5
# -------

run_make_test(undef, 'two',
              "$unk aa bb\n$erstr\n#MAKE#: *** [#MAKEFILE#:2: two] Error $ernum\n", 512);

# SV #56918 : Test the unknown command as the second recipe line

($ernum, $erstr) = errors_getinfo($unk, " qq rr");
run_make_test(qq!
three:
\t\@echo one
\t$unk qq rr
!, 'three',
              "one\n$unk qq rr\n$erstr\n#MAKE#: *** [#MAKEFILE#:4: three] Error $ernum\n", 512);

# Try failing due to non-executable file

if ($ERR_nonexe_file) {
    my $noexe = './barfooblatboz';
    touch($noexe);

    run_make_test(qq!
    one: ; -$noexe xx yy
    two: ; $noexe aa bb
    !,
                  'one', "$noexe xx yy\n#MAKE#: $noexe: $ERR_nonexe_file\n#MAKE#: [#MAKEFILE#:2: one] Error 127 (ignored)\n");

    unlink($noexe);
}

# Try failing by "running" a directory

if ($ERR_exe_dir) {
    mkdir('sd', 0775) or print "mkdir: sd: $!\n";

    ($ernum, $erstr) = errors_getinfo('sd', '', $ERR_exe_dir);

    run_make_test(q!
PATH := .
all: ; sd
!,
              '', "sd\n$erstr\n#MAKE#: *** [#MAKEFILE#:3: all] Error $ernum", 512);

    if ($port_type eq 'W32') {
        $ernum = 5;
        $erstr = "process_begin: CreateProcess(NULL, ./sd, ...) failed.\nmake (e=5): Access is denied.";
    } else {
        $ernum = 127;
        $erstr = "#MAKE#: ./sd: $ERR_exe_dir";
    }

    run_make_test(q!
all: ; ./sd
!,
              '', "./sd\n$erstr\n#MAKE#: *** [#MAKEFILE#:2: all] Error $ernum", 512);

    rmdir('sd');
}

1;
